#include <iostream>
#include <signal.h>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

void myhandler(int signo)
{
    pid_t rid = waitpid(-1,nullptr,0);
    cout << "a signo get : " << signo << " mypid " << getpid() << " rid : " << rid << endl;
}

int main()
{
    signal(17,myhandler);
    
    pid_t id = fork();
    if(id == 0)
    {
        //child
        cout << "child process " << getpid() << " myppid : " << getppid() << endl;
        sleep(5);
        exit(0);
    }
    //father
    while(1)
    {
        cout << "father process " << getpid() << endl;
        sleep(1);
    }
    return 0;
}

// volatile int flag;

// void myhandler(int signo)
// {
//     cout << "get a signo : " << signo << endl;
//     flag = 1;
// }

// int main()
// {
//     signal(2,myhandler);
//     while(!flag); //flag = 0 为假 !flag 为真

//     cout << "a process quit ! " << endl;
//     return 0;
// }

// void Printpending()
// {
//     sigset_t set;
//     sigpending(&set);
//     for(int signo = 31; signo>=1; signo--)
//     {
//         if(sigismember(&set,signo)) cout <<"1";
//         else cout<<"0";
//     }
//     cout << endl;
// }

// void myhandler(int signo)
// {
//     cout << "get a signo : " << signo << endl;
//     while(1)
//     {
//         Printpending();
//         sleep(1);
//     }
// }

// int main()
// {
//     struct sigaction act,oact;
//     memset(&act,0,sizeof(act));
//     memset(&oact,0,sizeof(oact));

//     //清空信号集
//     sigemptyset(&act.sa_mask);
//     //添加屏蔽信号
//     sigaddset(&act.sa_mask,1);
//     sigaddset(&act.sa_mask,3);
//     sigaddset(&act.sa_mask,4);
//     sigaddset(&act.sa_mask,9);
//     //设置自定义方法
//     act.sa_handler = myhandler;
//     sigaction(2,&act,&oact);    

//     while(1)
//     {
//         cout << "i am a process mypid : " << getpid() << endl;
//         sleep(1);
//     }

//     return 0;
// }